💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    13 Refresh Token과 JWT 인증 심화 | ✅ 편저: 코담 운영자

    13-Refresh Token과 JWT 인증 심화

    - Refresh Token과 JWT 인증 심화

    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series


    1. 개요

    이번 강의는 이전에 구성한 JWT(Json Web Token) 인증의 Refresh Token 사용법과 JWT 인증 설정 커스터마이징에 대해 다루는 짧은 심화편입니다.


    2. JWT 인증 흐름 복습

    • /api/token/ 경로에 POST 요청 → access token + refresh token 응답
    • access token은 만료 시간이 있음 → 만료 후 재사용 불가
    • refresh token은 비교적 긴 유효기간을 가짐 → 새로운 access token 발급에 사용됨

    3. Refresh Token을 이용한 access token 갱신

    /api/token/refresh/ 경로로 POST 요청 시, 새로운 access token이 발급됩니다.

    요청 예시 (api.http 파일에서):

    POST http://localhost:8000/api/token/refresh/ HTTP/1.1
    Content-Type: application/json
    
    {
      "refresh": "<refresh_token>"
    }
    
    • 이 요청은 access token이 만료된 경우에도 유효한 refresh token만 있다면 새로운 access token을 발급합니다.
    • 새로 발급된 access token은 다시 Authorization 헤더에 넣어 API 요청에 사용 가능

    4. simplejwt 기본 설정 및 변경 옵션

    djangorestframework-simplejwt 패키지는 다양한 설정을 제공합니다.

    주요 설정 항목:

    from datetime import timedelta
    
    SIMPLE_JWT = {
        'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),   # 액세스 토큰 유효 시간
        'REFRESH_TOKEN_LIFETIME': timedelta(days=1),      # 리프레시 토큰 유효 시간
        'ALGORITHM': 'HS256',                             # 토큰 서명 알고리즘
        'SIGNING_KEY': SECRET_KEY,             #서명에 사용할 키 (보통 Django SECRET_KEY)
        'AUTH_HEADER_TYPES': ('Bearer',)  #인증헤더타입 (예:Authorization: Bearer<token>)
    }
    
    
    • 기본적으로 access token은 5분, refresh token은 1일 유효
    • 설정을 통해 유효시간을 늘리거나 줄일 수 있음
    • 서명 키, 인코딩 알고리즘, 인증 헤더 형식 등도 변경 가능

    5. 커스터마이징 포인트

    • 설정 파일에서 Token View에 사용할 serializer 교체 가능
    • 토큰 payload 구조를 커스터마이징하려면 custom serializer 작성 가능
    • 추가적인 클레임(claim)을 넣고 싶다면 TokenObtainPairSerializer를 상속 받아 오버라이딩

    ✅ 1) drf_course/auth_serializers.py

    from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
    class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
        def validate(self, attrs):
            data = super().validate(attrs)
            data['username'] = self.user.username
            print("✅ CustomTokenObtainPairSerializer.validate()  :", data)
    
            # 추가 정보도 넣을 수 있음
            return data
    

    ✅ 2) drf_course/custom_token_view.py

    from rest_framework_simplejwt.views import TokenObtainPairView
    from .auth_serializers import CustomTokenObtainPairSerializer
    
    class CustomTokenObtainPairView(TokenObtainPairView):
        serializer_class = CustomTokenObtainPairSerializer
    

    ✅ 3) drf_course/urls.py

    from django.urls import path
    from .custom_token_view import CustomTokenObtainPairView
    from rest_framework_simplejwt.views import TokenRefreshView
    
    urlpatterns = [
        path('api/token/',CustomTokenObtainPairView.as_view(),name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ]
    
    

    정리

    • 커스텀 시리얼라이저와 뷰를 새로 만든 뒤

    • urls.py에서 해당 뷰를 등록하면 끝!

    이 방법이 가장 깔끔하고 유지보수에도 좋아요.


    6. 정리

    • JWT 인증에서 access token은 짧은 수명을 갖고, refresh token은 재발급을 위한 용도로 사용됨
    • /api/token/refresh/를 이용해 access token 재발급 가능
    • simplejwt는 다양한 설정을 통해 인증 시스템을 유연하게 조정 가능

    다음 강의에서는 Update 및 Delete API 구현을 실습하며 권한 설정이 실제로 어떻게 작동하는지 확인합니다.

    TOP
    preload preload